package doubleLinkList

import "fmt"

// double link list Node
type DulNode struct {
	prior *DulNode
	next  *DulNode
	data  int
}

func CreateDoubleLinkList(i int) *DulNode {
	return &DulNode{data: i}
}

// 从后插入
func (node *DulNode) Append(n *DulNode) {
	if node.GetNext() == nil {
		node.SetNext(n)
	} else {
		node.GetNext().SetNext(n)
	}
}

// 从前插入
func (node *DulNode) Insert(n *DulNode) {
	prior := node.GetPrior()
	if prior != nil {
		prior.SetNext(n)
		n.SetPrior(prior)
		n.SetNext(node)
		node.SetPrior(n)
	} else {
		node.SetPrior(n)
		n.SetNext(node)
	}
}

func (node *DulNode) C(n *DulNode, i int) {
	// 找到第N个
	currentNode := node
	for tips := 1; i > tips; tips++ {
		if currentNode.GetNext() == nil && tips < i {
			panic("超出且未到")
		}
		currentNode = currentNode.GetNext()
	}
	// 新元素的前驱设置为原位置元素的前驱
	if currentNode.GetPrior() != nil {
		n.SetPrior(currentNode.GetPrior())
		// 原位置元素前驱的后驱设置为新元素
		currentNode.GetPrior().SetNext(n)
	}
	// 新元素的后驱设置为原位置元素
	n.SetNext(currentNode)
	// 原位置元素的前驱要为新元素
	currentNode.SetPrior(n)
}

func (node *DulNode) GetData() int {
	return node.data
}

func (node *DulNode) GetNext() *DulNode {
	return node.next
}

func (node *DulNode) SetNext(n *DulNode) {
	node.next = n
	n.prior = node
}

func (node *DulNode) SetPrior(n *DulNode) {
	node.prior = n
	n.next = node
}

func (node *DulNode) GetPrior() *DulNode {
	return node.prior
}

func (node *DulNode) V() int {
	return node.data
}

func (n *DulNode) Len() int {
	i := 1
	tmp := n
	for tmp.GetNext() != nil {
		i++
		tmp = tmp.GetNext()
	}
	return i
}

func (n *DulNode) Dd() {
	tmp := n
	for {
		if tmp.GetNext() == nil {
			fmt.Println(tmp.V())
			break
		}
		fmt.Println(tmp.V())
		tmp = tmp.GetNext()
	}
}
